#include <Mitrix_Map.h>
namespace M_M_Map
{   
    bool position_equals(m_position p1,m_position p2){
        if(p1.col!=p2.col)
            return false;
        if(p1.row!=p2.row){
            return false;
        }
        return true;
    }
    class Mitrix_StraightPath
    {
    private:
        /* data */
        Mitrix_M_Map* M_Map;
        m_position start;
        m_position end;
        vector<m_position> trajectory;
        // bool positionQualified(m_position start,m_position p,double k){
        //     double center_col=start.col+0.5;
        //     double center_row=start.row+0.5;
        //     double k1=1.0*(p.row-center_row)/(p.col-center_col);
        //     double k2=1.0*(p.row+1-center_row)/(p.col-center_col);
        //     double k3=1.0*(p.row-center_row)/(p.col+1-center_col);
        //     double k4=1.0*(p.row+1-center_row)/(p.col+1-center_col);
        //     double max_k=k1;
        //     if(k2>max_k) max_k=k2;
        //     if(k3>max_k) max_k=k3;
        //     if(k4>max_k) max_k=k4;
        //     double min_k=k1;
        //     if(k2<min_k) min_k=k2;
        //     if(k3<min_k) min_k=k3;
        //     if(k4<min_k) min_k=k4;
        //     if(min_k<=k&&max_k>=k){
        //         return true;
        //     }
        //     return false;

        // }
    public:
        Mitrix_StraightPath(/* args */Mitrix_M_Map* m){
            this->M_Map=m;
        }
        void set_S_E(m_position start,m_position end){
            this->start=start;
            this->end=end;
        }
        ~Mitrix_StraightPath(){

        }
        bool expolring();
        int pathLength(){
            return this->trajectory.size();
        }
        void mark(){
            for(int i=0;i<trajectory.size();i++){
                this->M_Map->setPath(trajectory.at(i));
            }
        }
    };
    
    
} // namespace M_M_Map
//左上方是零点
bool M_M_Map::Mitrix_StraightPath::expolring(){
    if(start.row==end.row&&start.col==end.col){
        return false;
    }
    m_position p=start;
    while(!position_equals(p,end)){
        int col_d=end.col-p.col;
        int row_d=end.row-p.row;
        //横向距离大于纵向距离
        if(abs(col_d)>abs(row_d)){
            p.col+=col_d>0?1:-1;
        }
        else{
            p.row+=row_d>0?1:-1;
        }
        if(!this->M_Map->isValid(p)) 
            return false;
        trajectory.insert(trajectory.end(),p);
    }
    return true;
    // //正上正下,正左正右
    // if(end.col==start.col||end.row==start.row){
    //     if(end.row==start.row){
    //         //正右
    //         if(end.col>start.col){
    //             m_position now=start;
    //             while(now.col!=end.col||now.row!=start.row){
    //                 now.col=now.col+1;
    //                 if(!this->M_Map->isValid(now))
    //                     return false;
    //                 trajectory.insert(trajectory.end(),now);
    //             }
    //         }
    //         //正左
    //         if(end.col<start.col){
    //             m_position now=start;
    //             while(now.col!=end.col||now.row!=start.row){
    //                 now.col=now.col-1;
    //                 if(!this->M_Map->isValid(now))
    //                     return false;
    //                 trajectory.insert(trajectory.end(),now);
    //             }
    //         }

    //     }
    //     if(end.col==start.col){
    //         //正上
    //         if(end.row<start.row){
    //             m_position now=start;
    //             while(now.col!=end.col||now.row!=start.row){
    //                 now.row=now.row-1;
    //                 if(!this->M_Map->isValid(now))
    //                     return false;
    //                 trajectory.insert(trajectory.end(),now);
    //             }
    //         }
    //         //正下
    //         if(end.row>start.row){
    //             m_position now=start;
    //             while(now.col!=end.col||now.row!=start.row){
    //                 now.row=now.row+1;
    //                 if(!this->M_Map->isValid(now))
    //                     return false;
    //                 trajectory.insert(trajectory.end(),now);
    //             }
    //         }
    //     }
    // }
    // else{
    //     //计算斜率
    //     double k=1.0*(end.row-start.row)/(1.0*(end.col-start.col));
    //     if(end.col>start.col){
    //         //1~正无穷，下偏右（先探索下再探索右下）
    //         if(k>1){
    //             m_position now=start;
    //             while(now.col!=end.col||now.row!=start.row){
    //                 now.row=now.row+1;
                    
    //                 if(!this->M_Map->isValid(now))
    //                     return false;
                    
    //                 trajectory.insert(trajectory.end(),now);
    //             }
    //         }
    //         //0～1,右偏下
    //         if(k>0&&k<=1){

    //         }
    //         //-1~0 右偏上
    //         if(k>=-1&&k<0){

    //         }
    //         //-1～负无穷上偏右
    //         if(k<-1){

    //         }
    //     }
    //     if(end.col<start.col){
    //          //1~正无穷，上偏左
    //          if(k>1){

    //          }
    //         //0～1,左偏上
    //         if(k>0&&k<=1){

    //         }
    //         //-1~0 左偏下
    //         if(k>=-1&&k<0){

    //         }
    //         //-1～负无穷 下偏左
    //         if(k<-1)
    //     }
        
    // }
    

}